home *** CD-ROM | disk | FTP | other *** search
/ Aminet 39 / Aminet 39 (2000)(Schatztruhe)[!][Oct 2000].iso / Aminet / disk / misc / CopyLockDecode.lha / CopyLockDecoder+.asm < prev    next >
Encoding:
Assembly Source File  |  2000-02-11  |  21.1 KB  |  1,223 lines

  1.  
  2.     include 'exec/execbase.i'
  3.     include 'libraries/reqtools.i'
  4.     include 'lvo/dos_lib.i'
  5.     include 'lvo/exec_lib.i'
  6.     include 'lvo/reqtools_lib.i'
  7.  
  8. Test    =    0    ; 0 - off ; 1 - on
  9.  
  10. DosBase        =    0*4
  11. ReqBase        =    1*4
  12. FileReqL    =    2*4
  13. FileHandles    =    3*4
  14. ReadedBytes    =    4*4
  15.  
  16.     Section Main_Code,Code
  17.  
  18.     include    'dh1:sources/sources/easystart.i'
  19.  
  20. OpenIt
  21.     lea    Variables(pc),a5
  22.  
  23. ;open dos.library
  24.  
  25.     moveq    #0,d0
  26.     lea    DosName(pc),a1
  27.     move.l    4.w,a6
  28.     jsr    _LVOOpenLibrary(a6)
  29.     move.l    d0,DosBase(a5)
  30.     beq.b    ErrorOpenDos
  31.  
  32. ;open reqtools.library
  33.  
  34.     moveq    #38,d0        ;version 38
  35.     lea    ReqName(pc),a1
  36.     jsr    _LVOOpenLibrary(a6)
  37.     move.l    d0,ReqBase(a5)
  38.     beq.b    ErrorOpenReq
  39.  
  40. ;przydzielenie struktury dla file requesterow
  41.  
  42.     moveq    #0,d0
  43.     sub.l    a0,a0
  44.     move.l    ReqBase(a5),a6
  45.     jsr    _LVOrtAllocRequestA(a6)
  46.     move.l    d0,FileReqL(a5)
  47.     beq.b    ErrorAllocReqL
  48.  
  49.     bsr.b    Main
  50.  
  51.     move.l    FileReqL(a5),a1
  52.     move.l    ReqBase(a5),a6
  53.     jsr    _LVOrtFreeRequest(a6)
  54. ErrorAllocReqL
  55.     move.l    ReqBase(a5),a1
  56.     move.l    4.w,a6
  57.     jsr    _LVOCloseLibrary(a6)
  58. ErrorOpenReq
  59.     move.l    DosBase(a5),a1
  60.     move.l    4.w,a6
  61.     jsr    _LVOCloseLibrary(a6)
  62. ErrorOpenDos
  63.     moveq    #0,d0
  64.     rts
  65.  
  66. **************************************************************************
  67.  
  68. Main
  69.     lea    About(pc),a1
  70.     moveq    #0,D0
  71.     bsr.w    Request
  72.  
  73.     lea    FileReqNameLoad(pc),a3
  74.     bsr.w    ChooseFile
  75.     tst.l    d0
  76.     beq    Quit
  77.  
  78.     bsr.w    LoadFile
  79.     tst.l    d0
  80.     beq    Quit
  81.  
  82.     lea    WhichD3(pc),a1
  83.     moveq    #1,D0
  84.     bsr.w    Request
  85.     move.w    D0,ValueD3
  86.     beq.b    .zero
  87.     move.w    #$100F,ValueD3
  88. .zero
  89.     lea    WhatSYNCUsed(pc),a1
  90.     moveq    #-1,D0
  91.     bsr.w    Request
  92.     move.w    D0,OriginalSYNC
  93.     beq.b    .original
  94.  
  95.     lea    InsertAnyDOSDisk(pc),a1
  96.     moveq    #0,D0
  97.     bsr.w    Request
  98.     bra.b    .go
  99. .original
  100.     lea    InsertOriginalDisk(pc),a1
  101.     moveq    #0,D0
  102.     bsr.w    Request
  103. .go
  104.     bsr.w    Decode
  105.     lea    Variables(pc),a5
  106.     tst.l    d0
  107.     beq.b    wrong
  108.  
  109.     lea    FileReqNameSave(pc),a3
  110.     bsr.b    ChooseFile
  111.     tst.l    d0
  112.     beq.b    Quit
  113.  
  114.     move.l    #SaveBufor,d7
  115.     move.l    DestDecode,d0
  116.     sub.l    d7,d0
  117.     move.l    ReadedBytes(a5),d6
  118.     sub.l    d0,d6
  119.     move.l    d0,ReadedBytes(a5)
  120.     bsr.w    SaveFile
  121.     tst.l    d0
  122.     beq.b    Quit
  123.  
  124.     tst.w    Again
  125.     beq.b    .skip
  126.  
  127.     lea    FileReqNameSave(pc),a3
  128.     bsr.b    ChooseFile
  129.     tst.l    d0
  130.     beq.b    Quit
  131.  
  132.     move.l    #Bufor,d7
  133.     add.l    ReadedBytes(a5),d7
  134.     move.l    d6,ReadedBytes(a5)
  135.     bsr.w    SaveFile
  136.     tst.l    d0
  137.     beq.b    Quit
  138.  
  139.     bsr.w    DisplayRegs
  140. .skip
  141.     lea    Complete(pc),a1
  142.     moveq    #0,D0
  143.     bsr.w    Request
  144.  
  145.     bra.b    Quit
  146. wrong
  147.     lea    WrongStack(pc),a1
  148.     moveq    #0,D0
  149.     bsr.w    Request
  150. Quit
  151.     rts
  152.  
  153. **************************************************************************
  154.  
  155. ChooseFile
  156.     lea    TagsLoad(pc),a0
  157.     move.l    FileReqL(a5),a1
  158.     lea    FileNameL,a2
  159.     move.l    ReqBase(a5),a6
  160.     jsr    _LVOrtFileRequestA(a6)
  161.  
  162.     tst.l    d0
  163.     beq.b    Cancel
  164.  
  165.     lea    FileNameL,a0
  166.     lea    FullNameL,a1
  167.     move.l    FileReqL(a5),a2
  168.     move.l    $10(a2),a2
  169.     tst.b    (a2)
  170.     beq.b    _Petla2
  171. _Petla:
  172.     move.b    (a2)+,(a1)+
  173.     bne.b    _Petla
  174.     subq.l    #2,a1
  175.     move.b    (a1)+,d0
  176.     cmp.b    #':',d0
  177.     beq.s    _Petla2
  178.     move.b    #'/',(a1)+
  179. _Petla2:
  180.     move.b    (a0)+,(a1)+
  181.     bne.b    _Petla2
  182.     move.b    #0,(a1)+
  183.  
  184.     moveq    #1,D0
  185. Cancel
  186.     rts
  187.  
  188.  
  189. LoadFile
  190.     lea    FullNameL,a0
  191.     move.l    a0,d1
  192.     move.l    #MODE_OLDFILE,d2
  193.     move.l    DosBase(a5),a6
  194.     jsr    _LVOOpen(a6)
  195.     move.l    d0,FileHandles(a5)
  196.     beq.b    .ErrorOpenFile
  197.  
  198.     move.l    FileHandles(a5),d1
  199.     move.l    #Bufor,d2
  200.     move.l    #$50000,d3
  201.     move.l    DosBase(a5),a6
  202.     jsr    _LVORead(a6)
  203.     move.l    D0,ReadedBytes(A5)
  204.     beq.b    .ErrorOpenFile
  205.  
  206.     move.l    FileHandles(a5),d1
  207.     move.l    DosBase(a5),a6
  208.     jsr    _LVOClose(a6)
  209.  
  210.     moveq    #1,D0
  211. .ErrorOpenFile
  212.     rts
  213.  
  214. SaveFile
  215.     lea    FullNameL,a0
  216.     move.l    a0,d1
  217.     move.l    #MODE_NEWFILE,d2
  218.     move.l    DosBase(a5),a6
  219.     jsr    _LVOOpen(a6)
  220.     move.l    d0,FileHandles(a5)
  221.     beq.b    .ErrorOpenFile
  222.  
  223.     move.l    FileHandles(a5),d1
  224.     move.l    d7,d2
  225.     move.l    ReadedBytes(A5),d3
  226.     move.l    DosBase(a5),a6
  227.     jsr    _LVOWrite(a6)
  228.     tst.l    d0
  229.     beq.b    .ErrorOpenFile
  230.  
  231.     move.l    FileHandles(a5),d1
  232.     move.l    DosBase(a5),a6
  233.     jsr    _LVOClose(a6)
  234.  
  235.     moveq    #1,D0
  236. .ErrorOpenFile
  237.     rts
  238.  
  239. ***************************************************************************
  240.  
  241. Request
  242.     lea    RequesterTags(pc),a0
  243.     tst.l    D0
  244.     beq.b    .skip
  245.     bpl.b    .skip3
  246.     lea    RequesterGad2(pc),a2
  247.     bra.b    .skip2
  248. .skip
  249.     lea    RequesterGad(pc),a2
  250.     bra.b    .skip2
  251. .skip3
  252.     lea    RequesterGad3(pc),a2
  253. .skip2
  254.     sub.l    a3,a3
  255.     sub.l    a4,a4
  256.     move.l    ReqBase(a5),a6
  257.     jsr    _LVOrtEZRequestA(a6)
  258.  
  259.     rts
  260.  
  261. **************************************************************************
  262.  
  263. DisplayRegs
  264. ;    tst.w    OriginalSYNC
  265. ;    bne.b    .skip
  266.  
  267.     lea    AllRegsText(pc),a1
  268.     lea    Registers6(pc),a4
  269. .go
  270.     lea    RequesterTags(pc),a0
  271.     lea    RequesterGad(pc),a2
  272.     sub.l    a3,a3
  273.     move.l    ReqBase(a5),a6
  274.     jsr    _LVOrtEZRequestA(a6)
  275.  
  276.     rts
  277. ;.skip
  278. ;    lea    RegsText(pc),a1
  279. ;    lea    Registers6+4(pc),a4
  280. ;    bra.b    .go
  281.  
  282. **************************************************************************
  283.  
  284. GetVBR
  285.     OPT P=68020
  286.     movec    VBR,d0
  287.     OPT P=68000
  288.     rte
  289. IllegalTrap
  290.     or.w    #$0700,SR
  291.     move.l    $10.w,-(a7)
  292.     rts
  293. TraceTrap
  294.     move.l    $24.w,-(a7)
  295.     rts
  296.  
  297. Decode
  298.     moveq    #0,D0
  299.     lea    lbC000036(pc),a0
  300.     lea    Bufor,a1
  301.     lea    (a1),a2
  302.     add.l    #$50000,a2
  303. .loop
  304.     cmp.l    A1,A2
  305.     beq    not_found_stack
  306.     cmp.w    #$2F3C,(A1)+
  307.     bne.b    .loop
  308.     subq.l    #2,A1
  309.     moveq    #14,D1
  310. .loop2
  311.     cmp.l    (A0)+,(A1)+
  312.     bne    wrong_stack
  313.     dbf    D1,.loop2
  314.  
  315. .loop3
  316.     cmp.l    A1,A2
  317.     beq    not_found_lock
  318.     cmp.l    #$21CF0024,(A1)        ; used in Indy Heat
  319.     beq.b    .skip
  320.     cmp.w    #$23CF,(A1)+
  321.     bne.b    .loop3
  322.     cmp.l    #$00000024,(A1)
  323.     bne.b    .loop3
  324.     subq.l    #2,A1            ; start lock
  325. .skip
  326.     move.l    A1,SourceDecode
  327.     move.l    A1,Jumper
  328.     lea    Bufor,A0
  329.     sub.l    A0,A1
  330.     move.l    A1,D0
  331.     add.l    D0,DestDecode
  332.  
  333.     lea    GetVBR(pc),a5
  334.     move.l    4.w,a6
  335.     jsr    _LVOSupervisor(a6)
  336.     move.l    d0,a0
  337.     tst.l    d0
  338.     beq.b    .zero
  339.  
  340.     pea    IllegalTrap(pc)
  341.     move.l    (a7)+,$10(a0)
  342.     pea    TraceTrap(pc)
  343.     move.l    (a7)+,$24(a0)
  344. .zero
  345.     moveq    #0,d0
  346.     moveq    #~(CACRB_EnableI|CACRB_EnableD),d1
  347.     move.l    4.w,a6
  348.     jsr    _LVOCacheControl(a6)
  349.     move.l    d0,-(a7)
  350.  
  351.     sub.l    A0,A0
  352.     movem.l    (A0),D0-D7/A1-A2
  353.     lea    PageZero,A0
  354.     movem.l    D0-D7/A1-A2,(A0)
  355.     move.l    $60.w,PageZero+$28
  356.  
  357.     moveq    #0,D0
  358.     moveq    #0,D1
  359.     moveq    #0,D2
  360.     moveq    #0,D3
  361.     move.w    ValueD3,D3
  362.     moveq    #0,D4
  363.     moveq    #0,D5
  364.     moveq    #0,D6
  365.     moveq    #0,D7
  366.     sub.l    A0,A0
  367.     sub.l    A1,A1
  368.     sub.l    A2,A2
  369.     sub.l    A3,A3
  370.     sub.l    A4,A4
  371.     sub.l    A5,A5
  372.     sub.l    A6,A6
  373.  
  374.     bsr.s    CopyLock
  375.  
  376.     lea    PageZero,A0
  377.     movem.l    (A0),D0-D7/A1-A2
  378.     sub.l    A0,A0
  379.     movem.l    D0-D7/A1-A2,(A0)
  380.     move.l    PageZero+$28,$60.w
  381.  
  382.     move.l    (a7)+,d0
  383.     move.l    d0,d1
  384.     move.l    4.w,a6
  385.     jsr    _LVOCacheControl(a6)
  386.  
  387.     moveq    #1,D0
  388. not_found_lock
  389. wrong_stack
  390. not_found_stack
  391.     rts
  392.  
  393. CopyLock
  394.     pea    lbC00000C(PC)
  395.     move.l    (SP)+,$10.w
  396.     illegal
  397. lbC00000C:
  398.     movem.l    D0-D7/A0-A7,-(SP)
  399. ;    pea    lbC00002E(PC)
  400. ;    move.l    (SP)+,$10.w
  401. ;    movea.l    SP,A0
  402.  
  403. ;    OPT P=68020
  404.  
  405. ;    movec    CACR,D0
  406. ;    move.l    D0,$3C(SP)
  407.  
  408.     clr.l    $3C(a7)
  409.  
  410. ;    andi.l    #$7FFF7EFE,D0
  411. ;    movec    D0,CACR
  412.  
  413. ;    OPT P=68000
  414.  
  415. lbC00002E:
  416. ;    movea.l    A0,SP
  417.     movem.l    lbC000036(PC),D0-D7/A0-A6
  418.     bra.b    skip
  419. lbC000036
  420.     move.l    #$4E730000,-(SP)
  421.     move.l    #$10,-(SP)
  422.     move.l    #$4DDB9,-(SP)
  423.     move.l    #$BD96BDAE,-(SP)
  424.     move.l    #$B386B586,-(SP)
  425.     move.l    #$D046D246,-(SP)
  426.     move.l    #$246A71F,-(SP)
  427.     move.l    #$23C17,-(SP)
  428.     move.l    #$42C6F,-(SP)
  429.     move.l    #$BD96BDAE,-(SP)
  430. skip
  431.     move.l    (A7),StackMem
  432.     move.l    4(A7),StackMem+4
  433.  
  434.     move.l    #$4E730000,-(SP)
  435.  
  436.     pea    stack2(pc)
  437.     move.w    #$4EB9,-(A7)
  438.  
  439. ;    move.l    #$10,-(SP)
  440. ;    move.l    #$4DDB9,-(SP)        ; add.l D6,$10
  441.  
  442.     move.w    #$4,-(A7)
  443.     move.l    #$BD96BDAE,-(SP)
  444.     move.l    #$B386B586,-(SP)
  445.     move.l    #$D046D246,-(SP)
  446.     move.l    #$246A71F,-(SP)
  447.     move.l    #$23C17,-(SP)
  448.     move.w    #$2C6F,-(A7)
  449.  
  450. ;    move.l    #$42C6F,-(SP)        ; eor.l D6,(A6)
  451. ;    move.l    #$BD96BDAE,-(SP)    ; eor.l D6,4(A6)
  452.  
  453.     pea    stack(pc)
  454.     move.w    #$4EB9,-(A7)
  455.  
  456.     move.l    Jumper(pc),-(a7)
  457.  
  458.     ifne    Test
  459.  
  460. .m    move.w    $DFF006,$DFF180
  461.     bra.b    .m
  462.  
  463.     endc
  464.  
  465.     rts
  466. Jumper
  467.     dc.l    0
  468.  
  469. ; wykonywane podczas zakodowywania instrukcji - stos 1
  470.  
  471. stack
  472.     movem.l    D0/A5-A6,Regs
  473.  
  474.     move.l    SourceDecode(pc),A5    ; begin address instrukcji wykonanej
  475.     move.l    2+4(A7),A6        ; begin address instrukcji do wykonania
  476.     sub.l    A5,A6
  477.     move.l    A6,D0            ; instruction length
  478.     move.l    DestDecode(pc),A6
  479.     subq.l    #1,D0
  480. .loop
  481.     move.b    (A5)+,(A6)+
  482.     dbf    D0,.loop
  483.     move.l    A5,SourceDecode
  484.     move.l    A6,DestDecode
  485.  
  486.     ifne    Test
  487.  
  488.     sub.l    #SaveBufor,a6
  489.     cmp.l    #$EE0,a6
  490.     blo.b    .skip
  491.  
  492. .m    move.w    $DFF006,$DFF180
  493.     bra.b    .m
  494. .skip
  495.     endc
  496.  
  497.     movem.l    Regs(pc),D0/A5-A6
  498.  
  499.     eor.l    D6,(A6)            ; zakodowanie wykonanej instrukcji
  500.     eor.l    D6,4(A6)
  501.  
  502.     rts
  503.  
  504. stack1
  505.     movem.l    D0/A5-A6,Regs
  506.  
  507.     move.l    RegA6(pc),A6
  508.     eor.l    D6,(A6)            ; odkodowanie instrukcji
  509.     eor.l    D6,4(A6)
  510.  
  511.     move.l    SourceDecode(pc),A5    ; adres poczatkowy instrukcji wykonanej
  512.     move.l    2+4(A7),A6        ; adres poczatkowy instrukcji do wykonania
  513.     sub.l    A5,A6
  514.     move.l    A6,D0            ; instruction length
  515.     move.l    DestDecode(pc),A6
  516.     subq.l    #1,D0
  517. .loop
  518.     move.b    (A5)+,(A6)+
  519.     dbf    D0,.loop
  520.     move.l    A5,SourceDecode
  521.     move.l    A6,DestDecode
  522.  
  523.     move.l    RegA6(pc),A6
  524.     eor.l    D6,(A6)            ; zakodowanie wykonanej instrukcji
  525.     eor.l    D6,4(A6)
  526.  
  527.     movem.l    Regs(pc),D0/A5-A6
  528.  
  529.     move.w    4(A7),D6
  530.     andi.w    #$A71F,D6
  531.  
  532.     move.w    #$4EB9,0+$10(A7)        ; jsr stack
  533.     pea    stack(pc)
  534.     move.l    (A7)+,2+$10(A7)
  535.  
  536.     move.w    #$3C17,$A+$10(A7)        ; move.w (A7),D6
  537.     move.l    #$0246A71F,$C+$10(A7)        ; andi.w #$A71F,D6
  538.  
  539.     rts
  540.  
  541. ; wykonywane podczas odkodowywania instrukcji - stos 1
  542.  
  543. stack2
  544.  
  545. ; wykonane podczas wyjscia z copylock'a - stos 3
  546.  
  547.     cmp.l    #$487A0014,6+$10(A7)        ; pea ...(pc) ; stos 3 ; adres powrotu z illegal instruction
  548.     bne    .sk1
  549.     cmp.l    #$23CF0000,(A6)            ; move.l A7,$24 ; last instruction in copylock
  550.     bne    .sk1
  551.     cmp.w    #$0024,4(A6)
  552.     bne    .sk1
  553.  
  554.     ifne    Test
  555.  
  556. .m    move.w    $DFF006,$DFF180
  557.     bra.b    .m
  558.  
  559.     endc
  560.  
  561.     move.l    A0,Regs
  562.     move.l    DestDecode(pc),A0
  563.     move.l    (A6),(A0)+            ; copy instruction
  564.     move.w    4(A6),(A0)+            ; move.l A7,$24
  565.     move.l    A0,DestDecode
  566.     move.l    Regs(pc),A0
  567.  
  568.     move.w    #$4EB9,0+$10(A7)        ; jsr stack6
  569.     pea    stack6(pc)
  570.     move.l    (A7)+,2+$10(A7)            ; instead of eor.l D6,(A6)
  571.                         ; eor.l D6,4(A6)
  572.  
  573.     cmp.l    #$4E7B0002,$18+$10(A7)        ; movec D0,CACR
  574.     bne.b    .not_cacr
  575.  
  576.     move.l    #$4E714E71,$18+$10(A7)
  577. .not_cacr
  578.     cmp.l    #$4CDF01FF,$44+$10(A7)        ; movem.l (A7)+,D0-D7/A0
  579.     bne.b    .sk_ip2
  580.  
  581.     move.w    #$4EF9,$44+$10(A7)
  582.     pea    .FixStack(pc)            ; for Indy Heat ?
  583.     move.l    (a7)+,$46+$10(A7)
  584.  
  585.     bra    .sk_end
  586. .FixStack
  587.     move.l    a4,$42(a7)
  588.     movem.l    (a7)+,d0-a6
  589.     addq.w    #4,a7
  590.     and.w    #$7FFF,(a7)
  591.     rte
  592.  
  593. .sk_ip2
  594.     cmp.l    #$3EBC2700,$4E+$10(A7)        ; move.w #$2700,(A7)
  595.     bne.b    .sk_ip
  596.  
  597.     move.l    #$02577FFF,$4E+$10(A7)        ; -> andi.w #$7FFF,(A7) in game RoboCop
  598.  
  599. .sk_ip
  600.     cmp.l    #$2D7C0000,$40+$10(A7)        ; move.l #$500,$C2(A6)
  601.     bne    .sk_end
  602.     cmp.l    #$050000C2,$44+$10(A7)        ; return address from game Gods
  603.     bne    .sk_end
  604.  
  605.     move.l    #$4E714E71,$40+$10(A7)        ; normal return address from copylock
  606.     move.l    #$2D4C00C2,$44+$10(A7)        ; move.l A4,$C2(A6)
  607.  
  608.     bra    .sk_end
  609.  
  610. ; wykonane podczas wejscia do proc. odczytu z dysku - stos 1
  611.  
  612. .sk1
  613.     cmp.l    #$4E714E71,6+$10(A7)        ; stos 2
  614.     bne.b    .sk0
  615.     cmp.l    #$23CF0000,(A6)            ; move.l A7,$24
  616.     bne.b    .sk0
  617.     cmp.w    #$0024,4(A6)
  618.     bne.b    .sk0
  619.  
  620.     ifne    Test
  621.  
  622. .m1    move.w    $DFF006,$DFF180
  623.     bra.b    .m1
  624.  
  625.     endc
  626.  
  627.     move.w    #$4EB9,0+$10(A7)        ; jsr stack
  628.     pea    stack(pc)
  629.     move.l    (A7)+,2+$10(A7)            ; instead of eor.l D6,(A6)
  630.                         ; eor.l D6,4(A6)
  631.  
  632.     move.w    #$4EB9,$1E+$10(A7)        ; jsr stack4
  633.     pea    stack4(pc)
  634.     move.l    (A7)+,$20+$10(A7)        ; instead of add.l $8,D0
  635.  
  636.     move.w    #$4EB9,$36+$10(A7)        ; jsr stack5
  637.     pea    stack5(pc)
  638.     move.l    (A7)+,$38+$10(A7)        ; instead of add.l $8,D0
  639.  
  640.     move.l    A6,SourceCounter
  641.     addq.l    #6,SourceCounter        ; 6 bytes - instruction length move.l A7,$24
  642.     move.l    DestDecode(pc),DestCounter
  643.     addq.l    #6,DestCounter
  644.  
  645.     bra    .sk_end
  646.  
  647. .sk0
  648.     cmp.l    #$90AF001C,(A6)            ; sub.l $1C(A7),D0
  649.     bne.b    .sk2
  650.  
  651.     move.l    #$DDB90000,$1E+$10(A7)        ; add.l D6,$10
  652.     move.l    #$00104EB9,$22+$10(A7)        ; jsr stack3
  653.     pea    stack3(pc)
  654.     move.l    (A7)+,$26+$10(A7)
  655.     move.l    #$4E730000,$2A+$10(A7)        ; rte
  656.     addq.l    #6,(A7)
  657.  
  658.     bra    .sk_end
  659.  
  660. .sk2
  661.     cmp.l    #$2F7C0004,(A6)            ; move.l #$00042C6F,4(A7)
  662.     bne.b    .sk3
  663.     cmp.l    #$2C6F0004,4(A6)
  664.     bne.b    .sk3
  665.  
  666.     move.w    #$BD96,0+$10(A7)        ; eor.l D6,(A6)
  667.     move.l    #$BDAE0004,2+$10(A7)        ; eor.l D6,4(A6)
  668.     move.w    #$4EB9,$A+$10(A7)        ; jsr stack1
  669.     pea    stack1(pc)
  670.     move.l    (A7)+,$C+$10(A7)
  671.  
  672.     bra    .sk_end
  673.  
  674. .sk3
  675.     cmp.l    #$2F7C0000,(A6)            ; move.l #$10,$20(A7)
  676.     bne.b    .sk4
  677.     cmp.l    #$00100020,4(A6)
  678.     bne.b    .sk4
  679.  
  680.     move.l    #$DDB90000,$1E+$10(A7)        ; add.l D6,$10
  681.     move.l    #$00104EB9,$22+$10(A7)        ; jsr stack3
  682.     pea    stack3(pc)
  683.     move.l    (A7)+,$26+$10(A7)
  684.     move.l    #$4E730000,$2A+$10(A7)        ; rte
  685.     addq.l    #6,(A7)
  686.  
  687.     bra    .sk_end
  688.  
  689. .sk4
  690.     cmp.l    #$90AF0004,(A6)            ; sub.l 4(A7),D0
  691.     bne.b    .sk5
  692.  
  693.     move.w    #$BD96,0+$10(A7)        ; eor.l D6,(A6)
  694.     move.l    #$BDAE0004,2+$10(A7)        ; eor.l D6,4(A6)
  695.     move.w    #$4EB9,$A+$10(A7)        ; jsr stack1
  696.     pea    stack1(pc)
  697.     move.l    (A7)+,$C+$10(A7)
  698.  
  699.     bra    .sk_end
  700.  
  701. .sk5
  702.     cmp.l    #$90AF0024,(A6)            ; sub.l $24(A7),D0
  703.     bne.b    .sk6
  704.  
  705.     move.w    #$4EB9,$1E+$10(A7)        ; jsr stack2
  706.     pea    stack2(pc)
  707.     move.l    (A7)+,$20+$10(A7)
  708.     move.l    #$4E730000,$24+$10(A7)        ; rte
  709.  
  710.     move.l    StackMem(pc),$28+$10(A7)
  711.     move.l    StackMem+4(pc),$2C+$10(A7)
  712.  
  713.     bra    .sk_end
  714.  
  715. .sk6
  716.     cmp.l    #$2F7C0004,(A6)            ; move.l #$4DDB9,$1C(A7)
  717.     bne.b    .sk7
  718.     cmp.l    #$DDB9001C,4(A6)
  719.     bne.b    .sk7
  720.  
  721.     move.l    #$DDB90000,$1E+$10(A7)        ; add.l D6,$10
  722.     move.l    #$00104EB9,$22+$10(A7)        ; jsr stack3
  723.     pea    stack3(pc)
  724.     move.l    (A7)+,$26+$10(A7)
  725.     move.l    #$4E730000,$2A+$10(A7)        ; rte
  726.     addq.l    #6,(A7)
  727.  
  728.     bra.b    .sk_end
  729.  
  730. .sk7
  731.     cmp.l    #$2F7CBD96,(A6)            ; move.l #$BD96BDAE,0(A7)
  732.     bne.b    .sk8
  733.     cmp.l    #$BDAE0000,4(A6)
  734.     bne.b    .sk8
  735.  
  736.     move.w    #$BD96,0+$10(A7)        ; eor.l D6,(A6)
  737.     move.l    #$BDAE0004,2+$10(A7)        ; eor.l D6,4(A6)
  738.     move.w    #$4EB9,$A+$10(A7)        ; jsr stack1
  739.     pea    stack1(pc)
  740.     move.l    (A7)+,$C+$10(A7)
  741.  
  742. .sk8
  743. ; used in game Steg The Slug
  744.  
  745.     cmp.l    #$90AF0020,(A6)            ; sub.l $20(A7),D0
  746.     bne.b    .sk9
  747.  
  748.     move.l    #$DDB90000,$1E+$10(A7)        ; add.l D6,$10
  749.     move.l    #$00104EB9,$22+$10(A7)        ; jsr stack3
  750.     pea    stack3(pc)
  751.     move.l    (A7)+,$26+$10(A7)
  752.     move.l    #$4E730000,$2A+$10(A7)        ; rte
  753.     addq.l    #6,(A7)
  754. .sk9
  755.  
  756. .sk_end
  757.     add.l    D6,$10.w
  758.     move.l    A6,RegA6
  759.     rts
  760.  
  761. stack3
  762.     move.w    #$4EB9,$1E+$10(A7)        ; jsr stack2
  763.     pea    stack2(pc)
  764.     move.l    (A7)+,$20+$10(A7)
  765.     move.l    #$4E730000,$24+$10(A7)        ; rte
  766.  
  767.     move.l    StackMem(pc),$28+$10(A7)    ; odtworzenie gory stosu 1
  768.     move.l    StackMem+4(pc),$2C+$10(A7)
  769.  
  770.     subq.l    #6,(A7)
  771.  
  772.     rts
  773.  
  774. ; stos 3
  775.  
  776. stack6
  777.     eor.l    D6,(A6)
  778.     eor.l    D6,4(A6)
  779.  
  780.     move.l    SourceDecode(pc),A1
  781.     addq.l    #6,a1
  782.     move.l    DestDecode(pc),A2
  783. .loop
  784.     cmp.l    A0,A1
  785.     beq.b    .skip
  786.     addq.l    #2,a1
  787.     move.w    #$4E71,(A2)+        ; wstawiam nop, ale copylock
  788.     bra.b    .loop            ; niekoniecznie jest tym zakonczony
  789. .skip
  790.     move.l    a1,SourceDecode
  791.     move.l    a2,DestDecode
  792.  
  793.     move.l    A0,A1
  794.     sub.l    A2,A2
  795.     sub.l    A3,A3
  796.     lea    .sk(pc),A4        ; return address from copylock
  797.                     ; set to rts
  798. .sk
  799.     rts
  800.  
  801. ; w stosie 2 zamiast add.l $8,D0 , zakodowanie programu copylock'a
  802.  
  803. stack4
  804.     add.l    8.w,D0
  805.  
  806.     cmp.b    #1,Change
  807.     bne.b    .1
  808.  
  809.     move.w    #$4E6E,(A0)
  810. .1
  811.  
  812.     tst.w    OriginalSYNC
  813.     beq.b    _89
  814.  
  815.     cmp.b    #2,Change
  816.     bne.b    .2
  817.  
  818.     move.w    #$8914,2(A0)
  819. .2
  820.     cmp.b    #3,Change
  821.     bne.b    .3
  822.  
  823.     move.w    #$8911,2(A0)
  824. .3
  825.     cmp.b    #4,Change
  826.     bne.b    .4
  827.  
  828.     move.w    #$8912,2(A0)
  829. .4
  830.     cmp.b    #5,Change
  831.     bne.b    .5
  832.  
  833.     move.w    #$8951,2(A0)
  834. .5
  835.     cmp.b    #6,Change
  836.     bne.b    .6
  837.  
  838.     move.w    #$8915,2(A0)
  839. .6
  840.     clr.b    Change
  841.  
  842. _89
  843.  
  844.     cmp.l    #$10,A0            ; czy to pierwsze wejscie do stosu 2 ?
  845.     bne.b    .skip2            ; if = 0 tak
  846.  
  847.     move.w    #$BD96,0+$18(A7)    ; eor.l D6,(A6) ; wstawienie na poczatku stosu 2
  848.     move.l    #$BDAE0004,2+$18(A7)    ; eor.l D6,4(A6)
  849.  
  850.     bra.b    .skip
  851. .skip2
  852.     tst.b    NotCopy            ; czy instrukcja juz skopiowana ?
  853.     bne.b    .skip            ; if <> 0 tak
  854.  
  855.     movem.l    D0/A0-A1,Regs
  856.  
  857.     move.l    10+4(A7),A1        ; A1 - adres poczatkowy instrukcji do wykonania
  858.     sub.l    A0,A1            ; A0 - adres poczatkowy instrukcji wykonanej
  859.     move.l    A1,D0            ; dlugosc instrukcji wykonanej w bajtach
  860.     move.l    A0,A1
  861.     sub.l    SourceCounter(pc),A1    ; offset od poczatku copylock'a
  862.     add.l    DestCounter(pc),A1
  863.     subq.l    #1,D0
  864. .loop
  865.     move.b    (A0)+,(A1)+
  866.     dbf    D0,.loop
  867.  
  868.     move.l    A0,SourceDecode
  869.     move.l    A1,DestDecode
  870.  
  871.     movem.l    Regs(pc),D0/A0-A1
  872. .skip
  873.     rts
  874.  
  875. ; w stosie 2 zamiast add.l $8,D0 , odkodowanie programu copylock'a
  876.  
  877. stack5
  878.     add.l    8.w,D0
  879.  
  880.     eor.l    D0,(A0)+        ; odkodowanie nastepnej instrukcji
  881.     eor.l    D0,(A0)
  882.     addq.l    #4,(A7)            ; ominiecie ponownego dekodowania
  883.                     ; gdyz przed chwila to zrobilem
  884.  
  885.     movem.l    D0/A0-A1,Regs
  886.     subq.l    #4,A0
  887.  
  888.     clr.b    NotCopy
  889.  
  890.     move.w    (A0),D0
  891.     and.w    #$F0FF,D0
  892.     cmp.w    #$6000,D0        ; bsr.b ... or bra.b
  893.     bne.b    NotLongJump
  894.  
  895.     st    NotCopy
  896.  
  897.     move.l    A0,A1
  898.     sub.l    SourceCounter(pc),A1
  899.     add.l    DestCounter(pc),A1
  900.     move.l    (A0),(A1)
  901.  
  902.     bra    Exit
  903. NotLongJump
  904.     lsr.w    #8,D0
  905.     cmp.b    #$60,D0            ; bsr.b ... or bra.b
  906.     bne.b    NotJump
  907.  
  908.     st    NotCopy
  909.     
  910.     move.l    A0,A1
  911.     sub.l    SourceCounter(pc),A1
  912.     add.l    DestCounter(pc),A1
  913.     move.w    (A0),(A1)
  914.  
  915.     bra    Exit
  916. NotJump
  917.     cmp.w    #$4E75,(A0)        ; rts
  918.     bne.b    NotRts
  919.  
  920.     st    NotCopy
  921.     
  922.     move.l    A0,A1
  923.     sub.l    SourceCounter(pc),A1
  924.     add.l    DestCounter(pc),A1
  925.     move.w    (A0),(A1)
  926.  
  927.     bra    Exit
  928. NotRts
  929.     move.w    (A0),D0
  930.     and.w    #$F0FF,D0
  931.     cmp.w    #$50C8,D0        ; dbcc D?,...
  932.     bcs.b    NotDbcc
  933.     cmp.w    #$50CF,D0
  934.     bcc.b    NotDbcc
  935.  
  936.     st    NotCopy
  937.     
  938.     move.l    A0,A1
  939.     sub.l    SourceCounter(pc),A1
  940.     add.l    DestCounter(pc),A1
  941.     move.l    (A0),(A1)
  942.  
  943.     bra    Exit
  944. NotDbcc
  945.     cmp.w    #$4E6E,(A0)        ; move.l USP,A6
  946.     bne.b    NotUSPtoA6
  947.  
  948.     move.b    #1,Change
  949.     
  950.     move.w    #$4E71,(A0)
  951.  
  952.     bra    Exit
  953. NotUSPtoA6
  954.     tst.w    OriginalSYNC
  955.     beq    _89_2
  956.  
  957.     cmp.l    #$303C8914,(A0)        ; move.w #$8914,D0
  958.     bne.b    NotSYNC
  959.  
  960.     move.b    #2,Change
  961.  
  962.     move.w    #$4489,2(A0)
  963.  
  964.     bra    Exit
  965. NotSYNC
  966.     cmp.l    #$303C8911,(A0)        ; move.w #$8911,D0
  967.     bne.b    NotSYNC2
  968.  
  969.     move.b    #3,Change
  970.  
  971.     move.w    #$4489,2(A0)
  972.  
  973.     bra    Exit
  974. NotSYNC2
  975.     cmp.l    #$303C8912,(A0)        ; move.w #$8912,D0
  976.     bne.b    NotSYNC3
  977.  
  978.     move.b    #4,Change
  979.  
  980.     move.w    #$4489,2(A0)
  981.  
  982.     bra    Exit
  983. NotSYNC3
  984.     cmp.l    #$303C8951,(A0)        ; move.w #$8951,D0
  985.     bne.b    NotSYNC4
  986.  
  987.     move.b    #5,Change
  988.  
  989.     move.w    #$4489,2(A0)
  990.  
  991.     bra    Exit
  992. NotSYNC4
  993.     cmp.l    #$3D7C8915,(A0)        ; move.w #$8915,-8(A6)
  994.     bne.b    NotSYNC5
  995.  
  996.     move.b    #6,Change
  997.  
  998.     move.w    #$4489,2(A0)
  999.  
  1000.     bra    Exit
  1001. NotSYNC5
  1002.     cmp.l    #$3D7C8914,(A0)        ; move.w #$8914,-6(A6)
  1003.     bne.b    NotSYNC6
  1004.  
  1005.     move.b    #2,Change
  1006.  
  1007.     move.w    #$4489,2(A0)
  1008.  
  1009.     bra    Exit
  1010. NotSYNC6
  1011.     cmp.l    #$3D7C8911,(A0)        ; move.w #$8911,-4(A6)
  1012.     bne.b    NotSYNC7
  1013.  
  1014.     move.b    #3,Change
  1015.  
  1016.     move.w    #$4489,2(A0)
  1017.  
  1018.     bra    Exit
  1019. NotSYNC7
  1020.     cmp.l    #$3D7C8912,(A0)        ; move.w #$8912,-2(A6)
  1021.     bne.b    NotSYNC8
  1022.  
  1023.     move.b    #4,Change
  1024.  
  1025.     move.w    #$4489,2(A0)
  1026.  
  1027.     bra    Exit
  1028. NotSYNC8
  1029.     cmp.w    #$B0BC,(A0)        ; cmp.l #$A573632C,D0
  1030.     bne.b    NotCMP
  1031.  
  1032.     move.l    2(A0),4(A7)
  1033.  
  1034.     bra    Exit
  1035. NotCMP
  1036.     cmp.w    #$0C50,(A0)        ; cmpi.w #$2A91,(A0)
  1037.     bne.b    NotCMP2            ; cmpi.w #$AA92,(A0)
  1038.                     ; cmpi.w #$AA94,(A0)
  1039.     move.l    8(A7),A1        ; A0
  1040.     move.w    2(A0),(A1)
  1041.  
  1042.     bra    Exit
  1043. NotCMP2
  1044.     cmp.w    #$9081,(A0)        ; sub.l D1,D0
  1045.     bne.b    NotSub2
  1046.  
  1047.     move.l    #$25,4(A7)        ; D0=$25
  1048.     moveq    #$12,D1
  1049.  
  1050.     bra.b    Exit
  1051. NotSub2
  1052.     cmp.l    #$B07C03AC,(A0)        ; cmp.w #$03AC,D0
  1053.     bne.b    NotCMP3
  1054.  
  1055.     move.l    #$400,4(A7)        ; D0=$400
  1056.  
  1057.     bra.b    Exit
  1058. NotCMP3
  1059.     cmp.w    #$0C98,(A0)        ; cmpi.l #$552AAAA5,(A0)+
  1060.     bne.b    NotCMP4
  1061.     cmp.l    #$552AAAA5,2(A0)
  1062.     bne.b    NotCMP4
  1063.  
  1064.     move.l    8(A7),A1        ; A0
  1065.     move.l    2(A0),(A1)
  1066.  
  1067.     bra.b    Exit
  1068. NotCMP4
  1069.     cmp.w    #$0C98,(A0)        ; cmpi.l #$55292AA9,(A0)+
  1070.     bne.b    NotCMP5
  1071.     cmp.l    #$55292AA9,2(A0)
  1072.     bne.b    NotCMP5
  1073.  
  1074.     move.l    8(A7),A1        ; A0
  1075.     move.l    2(A0),(A1)
  1076.  
  1077.     bra.b    Exit
  1078. NotCMP5
  1079.     cmp.l    #$B07C0054,(A0)        ; cmp.w #$54,d0
  1080.     bne.b    NotCmp
  1081.  
  1082.     move.l    #$55,4(A7)        ; D0=$55
  1083.  
  1084.     bra.b    Exit
  1085. NotCmp
  1086. ;    cmp.w    #$2006,(A0)        ; move.l D6,D0
  1087. ;    bne.b    NotID
  1088.  
  1089. _89_2
  1090.     tst.w    Again
  1091.     bne.b    NotID
  1092.  
  1093.     cmp.w    #$DDFC,(A0)        ; adda.l #$???,A6
  1094.     bne.b    NotID
  1095.  
  1096.     st    Again
  1097.  
  1098. ; if you wish decode copylock+file, but you have not original game disk,
  1099. ; set one value below
  1100.  
  1101. ;    move.l    #$A3EF1306,4(A7)    ;ID value from Advanced Ski Simulator
  1102. ;    move.l    #$E55A6DD8,4(A7)    ;ID value from Defender 2
  1103. ;    move.l    #$EB3D7FF7,4(A7)    ;ID value from Die Hard 2
  1104. ;    move.l    #$9EA62DB3,4(A7)    ;ID value from Graham Goohes Cricket
  1105. ;    move.l    #$,4(A7)    ;ID value from Guardian Angel
  1106. ;    move.l    #$8290FFC1,4(A7)    ;ID value from Insects In Space
  1107. ;    move.l    #$4C41AE40,4(A7)    ;ID value from Italy 1990
  1108. ;    move.l    #$E55A6DD8,4(A7)    ;ID value from Munsters
  1109. ;    move.l    #$A3EF1306,4(A7)    ;ID value from Nitroboost Challenge
  1110. ;    move.l    #$704BCE83,4(A7)    ;ID value from Paradroid 90
  1111. ;    move.l    #$7C3369C9,4(A7)    ;ID value from Photon Storm
  1112. ;    move.l    #$DC84624B,4(A7)    ;ID value from Power Drift
  1113. ;    move.l    #$32734940,4(A7)    ;ID value from Resolution 101
  1114. ;    move.l    #$9884514B,4(A7)    ;ID value from RoboCop
  1115. ;    move.l    #$9EA62DB3,4(A7)    ;ID value from Spellfire The Sorcerer
  1116. ;    move.l    #$5C80675B,4(A7)    ;ID value from Steg The Slug
  1117. ;    move.l    #$32734940,4(A7)    ;ID value from Thunderstrike
  1118. ;    move.l    #$9B50CBE8,4(A7)    ;ID value from Total Recall
  1119.  
  1120.     lea    Registers6(pc),a0
  1121.  
  1122. ;    tst.w    OriginalSYNC
  1123. ;    bne.b    .skip
  1124.  
  1125.     move.l    4(A7),(a0)+
  1126. ;    bra.b    .go
  1127. ;.skip
  1128. ;    addq.l    #4,a0
  1129. ;.go
  1130.     move.l    d1,(a0)+
  1131.     move.l    d2,(a0)+
  1132.     move.l    d3,(a0)+
  1133.     move.l    d4,(a0)+
  1134.     move.l    d5,(a0)
  1135. NotID
  1136.  
  1137. Exit
  1138.     movem.l    Regs(pc),D0/A0-A1
  1139.     rts
  1140.  
  1141. **************************************************************************
  1142.  
  1143. DosName        dc.b    'dos.library',0
  1144. ReqName        dc.b    'reqtools.library',0
  1145.  
  1146. About        dc.b    'Wanted Team',10,10
  1147.         dc.b    'presents',10,10
  1148.         dc.b    'Rob Northen Copylock decoder V1.34',10,10
  1149.         dc.b    'Code: Mr.Larmer',10,10
  1150.         dc.b    'Release date: 30 January 2000',0
  1151. WrongStack
  1152.         dc.b    "Stack in your file isn't",10
  1153.         dc.b    'the same as in my procedure',10
  1154.         dc.b    "(loaded file isn't copylock)",0
  1155. WhatSYNCUsed
  1156.         dc.b    'If you use original key disk',10
  1157.         dc.b    'choose SYNC $89??',0
  1158. WhichD3
  1159.         dc.b    'Which value of D3 register',10
  1160.         dc.b    'you want to use ?',0
  1161. InsertOriginalDisk
  1162.         dc.b    'Insert original key disk with',10
  1163.         dc.b    'Rob Northen Copylock',10
  1164.         dc.b    'in drive df0:',0
  1165. InsertAnyDOSDisk
  1166.         dc.b    'Insert any DOS disk',10
  1167.         dc.b    'in drive df0:',0
  1168. FileReqNameLoad
  1169.         dc.b    'Choose Copylock program to load',0
  1170. FileReqNameSave
  1171.         dc.b    'Choose Copylock decoded to save',0
  1172.  
  1173. Complete    dc.b    'Decode complete',0
  1174. RequesterGad
  1175.         dc.b    'Ok',0
  1176. RequesterGad2
  1177.         dc.b    '$4489|$89??',0
  1178. RequesterGad3
  1179.         dc.b    '$100F|$0000',0
  1180. AllRegsText
  1181.         dc.b    'Registers used for decode file',10,10
  1182.         dc.b    'D0 = $%08lx , D1 = $%08lx',10
  1183.         dc.b    'D2 = $%08lx , D3 = $%08lx',10
  1184.         dc.b    'D4 = $%08lx , D5 = $%08lx',0
  1185. ;RegsText
  1186. ;        dc.b    'Registers used for decode file',10,10
  1187. ;        dc.b    'D0 =  unknown  , D1 = $%08lx',10
  1188. ;        dc.b    'D2 = $%08lx , D3 = $%08lx',10
  1189. ;        dc.b    'D4 = $%08lx , D5 = $%08lx',0
  1190.  
  1191.         CNOP 0,2
  1192. TagsLoad
  1193.         dc.l    RT_ReqPos,REQPOS_CENTERSCR
  1194.         dc.l    0
  1195. RequesterTags
  1196.         dc.l    RT_ReqPos,REQPOS_CENTERSCR
  1197.         dc.l    RTEZ_Flags,EZREQF_CENTERTEXT
  1198.         dc.l    0
  1199.  
  1200. StackMem    ds.l    2
  1201. Regs        ds.l    3
  1202. RegA6        dc.l    0
  1203. SourceDecode    dc.l    0
  1204. DestDecode    dc.l    SaveBufor
  1205. SourceCounter    dc.l    0
  1206. DestCounter    dc.l    0
  1207. NotCopy        dc.b    0
  1208. Change        dc.b    0
  1209. OriginalSYNC    dc.w    0
  1210. ValueD3        dc.w    0
  1211. Again        dc.w    0
  1212. Registers6    ds.l    6
  1213.  
  1214. Variables    ds.l    5
  1215.  
  1216.     section data,bss_c
  1217. Bufor        ds.b    $50004
  1218.     section data2,bss
  1219. FileNameL    ds.b    108
  1220. FullNameL    ds.b    256
  1221. PageZero    ds.b    $2C
  1222. SaveBufor    ds.b    $50004
  1223.